import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import router from '@/router'

// 获取token的函数，用于实时读取localStorage
function getToken() {
  return localStorage.getItem('token') || ''
}

// 获取用户信息的函数，用于实时读取localStorage
function getUserInfo() {
  try {
    const info = localStorage.getItem('userInfo')
    return info ? JSON.parse(info) : null
  } catch {
    return null
  }
}

export const useUserStore = defineStore('user', () => {
  // 使用函数来初始化，这样每次访问都会重新读取localStorage
  const token = ref(getToken())
  const userInfo = ref(getUserInfo())

  // 同步localStorage到store的函数
  function syncFromStorage() {
    // 强制从localStorage读取最新token和username
    const newToken = localStorage.getItem('token') || ''
    const newUsername = localStorage.getItem('username') || ''
    const newUserInfo = getUserInfo()
    
    // 如果token被删除（从有值变为空），需要跳转到登录页
    if (token.value && !newToken) {
      token.value = ''
      userInfo.value = null
      // 如果当前不在登录页，则跳转到登录页
      const currentPath = router.currentRoute.value.path
      if (currentPath !== '/login' && 
          currentPath !== '/ding' && 
          !currentPath.startsWith('/login-success')) {
        router.replace('/login')
      }
      return
    }
    
    // 更新token和userInfo，确保每次路由切换时强制从localStorage读取最新值
    token.value = newToken
    // 如果userInfo中有username，同步username；否则使用localStorage中的username
    if (newUserInfo) {
      userInfo.value = newUserInfo
    } else if (newUsername) {
      userInfo.value = {
        username: newUsername
      }
    } else {
      userInfo.value = null
    }
  }

  // 监听localStorage的变化（跨标签页或手动删除）
  if (typeof window !== 'undefined') {
    window.addEventListener('storage', (e) => {
      if (e.key === 'token' || e.key === 'userInfo') {
        syncFromStorage()
      }
    })

    // 定期检查localStorage（用于检测同标签页中手动删除的情况）
    // 因为storage事件只在其他标签页/窗口触发，同标签页手动删除不会触发
    setInterval(() => {
      const currentToken = getToken()
      // 如果store中有token但localStorage中没有，说明被手动删除了
      if (token.value && !currentToken) {
        syncFromStorage()
      } else if (!token.value && currentToken) {
        // 如果localStorage中有token但store中没有，同步过来
        token.value = currentToken
        userInfo.value = getUserInfo()
      }
    }, 500) // 每500ms检查一次
  }

  // 设置token和用户信息
  function setUserInfo(data) {
    // 确保 token 存在
    if (!data.token) {
      console.warn('[setUserInfo] token 为空，无法保存用户信息')
      return
    }
    
    token.value = data.token
    userInfo.value = {
      user_id: data.user_id,
      username: data.username,
      openid: data.openid // 将签名作为openid存储，方便后端根据签名查找数据
    }
    
    // 保存到localStorage（确保同步）
    localStorage.setItem('token', data.token)
    localStorage.setItem('userInfo', JSON.stringify(userInfo.value))
    
    // 如果有 username，也单独保存一份（用于兼容性）
    if (data.username) {
      localStorage.setItem('username', data.username)
    }
    
    // 如果有 openid（signature），也单独保存一份到localStorage
    if (data.openid) {
      localStorage.setItem('openid', data.openid)
      localStorage.setItem('signature', data.openid) // 同时保存为signature，保持兼容性
    }
  }

  // 清除用户信息（退出登录）
  function clearUserInfo() {
    token.value = ''
    userInfo.value = null
    localStorage.removeItem('token')
    localStorage.removeItem('userInfo')
    localStorage.removeItem('username')
    localStorage.removeItem('openid')
    localStorage.removeItem('signature')
  }

  // 检查是否已登录（computed属性，实时检查）
  const isLoggedIn = computed(() => {
    // 每次都从localStorage重新读取，确保获取最新值
    const currentToken = getToken()
    if (token.value !== currentToken) {
      syncFromStorage()
    }
    return !!token.value && !!getToken()
  })

  return {
    token,
    userInfo,
    setUserInfo,
    clearUserInfo,
    isLoggedIn,
    syncFromStorage
  }
})

